/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package juego;

import java.util.*;
import java.io.*;

/**
 *
 * @author VIC
 */
public class Main {

    public static void main(String[] args) {
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br =new BufferedReader (isr);
		try {
			System.out.println("Ingrese nombre de la ciudad");
			Juego juego = new Juego(br.readLine());
			juego.start();

		}
		catch(Exception e){
                    System.out.println("operacion invalida, se termino el juego");
                }
    }
}

class coordenadas{
    private int x;
    private int y;
    public void setX(int x){
        this.x=x;
    }
    public void setY(int y){
        this.y=y;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public coordenadas(int x,int y){
        this.x=x;
        this.y=y;
    }
}

class Juego{
    public static int gold;
    public static int silver;
    public static int energia;
    public static int petroleo;
    public static int madera;
    public static int experiencia;
    public static int turno;
    public ArrayList<Construccion> construcciones = new ArrayList<Construccion>();
    public ArrayList<coordenadas> posicion = new ArrayList<coordenadas>();
    public Mapa mapa;
	/*	============ ATRIBUTOS ============ */
    private final String nombreCiudad;
    private static final String[] opciones={"RECOLECTAR","CREAR","TURNO","CONSTRUIR","SALIDA"};

    public Juego(String nombreCiudad){
        this.nombreCiudad = nombreCiudad;
        System.out.println("FELICITACIONES!!! Tu imperio "+nombreCiudad+" ha sido creado");
    }
    public void start(){
        mapa=new Mapa();
        mapa.mostrar();
        while(true){
        //pedir comando
            System.out.println("Ingrese la opcion del comando que desea utilizar");
            System.out.println("[1] Recolectar");
            System.out.println("[2] Construir");
            System.out.println("[3] Crear");
            System.out.println("[4] Turno");
            System.out.println("[5] Salida");
            int numComando=-1;
            Scanner sc = new Scanner(System.in);
            String a = sc.nextLine();
                
            while(true){
                while (a.length()>1){
                    System.out.println("Debe ingresar solo un caracter del 1 al 5");
                    a = sc.nextLine();
                }
                if (a.compareTo("7")<0 && a.compareTo("0")>0){
                    numComando = Integer.parseInt(a);
                    break;
                }
                else{
                    System.out.println("Debe ingresar solo un caracter del 1 al 6");
                    a = sc.nextLine();
                }
            }

            numComando--;
            if(numComando==4){
                System.out.println("Está seguro que deseas salir? SI / NO");
                Scanner read =new Scanner(System.in);
                String answer=read.nextLine();
                if(answer.equals("SI")) {
                    System.out.println("Salio del Juego");
                    break; //sale del bucle principal del juego
                }
            }

            else{
                int x=0,y=0;
                switch(numComando){
                    case 0:
                        x = leerCoordenada("x");
                        y = leerCoordenada("y");
                        recolectar(x,y); break;
                    case 1:
                        x = leerCoordenada("x");
                        y = leerCoordenada("y");
                        construir(x,y);
                        break;
                    case 2:
                        x = leerCoordenada("x");
                        y = leerCoordenada("y");
                        crear(x,y); break;
                    case 3:
                        turno(); break;
                }
            }

            mapa.mostrar();
        }
    }
        
    public int leerCoordenada(String var){
        int a;
        System.out.println("ingrese la cordenada "+ var);
        while (true){
            try{
                Scanner sc = new Scanner(System.in);
                a = sc.nextInt();
                break;
            }
            catch(Exception e){
                System.out.println("ingrese un numero valido");
            }
        }
        return a;
    }

    public void recolectar(int x,int y){
    //VERIFICAR COORDENADAS (construccion?? incorrecta : correcta)
    //SI CORRECTA VALIDAR RECOLECCION ( -1 PTO. ENERGIA)
        int i;
        for (i=0;i<posicion.size();i++)
            if(x==posicion.get(i).getX() && y==posicion.get(i).getY() ) break;
            if(i==posicion.size())
                System.out.println("No se encontro construccion en esas coordenadas");
            else {
                if(construcciones.get(i).getEstado()!=-1)
                    if( (construcciones.get(i).getDuracion() + construcciones.get(i).getTiempoInicial()) >= turno)
                    construcciones.get(i).recolectar();
                else System.out.println("La produccion no esta lista");
            }
    }

    public void construir(int x,int y){
    //((construccion || unidad) ?? imprimir error : construye)
        System.out.println("Elija la construccion");
        Construccion.mostrarDisponibles();
        Scanner sc = new Scanner(System.in);
        String a = sc.nextLine();
        int indiceC;
        while(true){
            while (a.length()>1){
                System.out.println("Debe ingresar solo un caracter del 1 al 4");
                a = sc.nextLine();
            }
            if (a.compareTo("5")<0 && a.compareTo("0")>0){
                indiceC = Integer.parseInt(a);
                break;
            }
            else{
                System.out.println("Debe ingresar solo un caracter del 1 al 5");
                a = sc.nextLine();
            }
            System.out.println("Debe ingresar solo un caracter del 1 al 4");
            a = sc.nextLine();
        }
        System.out.println("Elija el tipo de construccion que desea crear");
        switch(indiceC) {
            case    1: Militar.mostrarMilitar(); break;
            case    2: Industria.mostrarIndustria(); break;
            case    3: Vivienda.mostrarVivienda(); break;
            case    4: Gobierno.mostrarGobierno(); break;
        }
        a = sc.nextLine(); //OPCION ELEGIDA
        
        //
        int indclase;
        while(true){
            while (a.length()>1){
                System.out.println("Debe ingresar solo un caracter del 1 al 4");
                a = sc.nextLine();
            }
            if (a.compareTo("5")<0 && a.compareTo("0")>0){
                indclase = Integer.parseInt(a); //Convertimos la opcion elegida a entero apra poder hacer los "case"
                break;
            }
            System.out.println("Debe ingresar solo un caracter del 1 al 4");
            a = sc.nextLine();
        }
        
        switch(indiceC) {
            case   1: //MILITAR
                construirMilitar(indclase,x,y);
                break; //break caso 1
            case   2: //INDUSTRIA
               contruirIndustria(indclase,x,y);
                break; //break caso 2

            case   3: //VIVIENDA
                contruirVivienda(indclase,x,y);
                break; //break caso 3

            case   4: //GOBIERNO
                contruirGobierno(indclase,x,y);
                break; //break caso 4

        } // Fin switch general (indiceC)
    } //Fin class CONSTRUIR

    public void crear(int x,int y){
		//(CONSTRUCCION(X,Y)??? Mostrar personajes_disponibles : salir)
		//LEER PERSONAJE ELEGIDO
		///CREAR PERSONAJE Y UBICAR(pedir (x,y) y validar)

    }
    public void turno(){
	Juego.turno++;
	for(int i=0;i<construcciones.size();i++)
	    if(construcciones.get(i).getEstado()!=-1)
	        if(construcciones.get(i).getDuracion()+construcciones.get(i).getTiempoInicial() >= turno)
	            System.out.println("Se puede recolectar en esta posicion "+ posicion.get(i).getX() +" " + posicion.get(i).getY());
    }
    public void Salida(){

    }

    public void construirMilitar(int indclase,int x, int y){
        switch(indclase){
            case 1:
                if(mapa.disponible(x,y,Cuartel.getLongx(),Cuartel.getLongy())){
                    Cuartel ocuartel=new Cuartel();
                    mapa.ubicarConstruccion(x,y,Cuartel.getLongx(),Cuartel.getLongy(),ocuartel,ocuartel.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ocuartel);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 1
            case 2:
                if(mapa.disponible(x,y,Astillero.getLongx(),Astillero.getLongy())){
                    Astillero oastillero=new Astillero();
                    mapa.ubicarConstruccion(x,y,Astillero.getLongx(),Astillero.getLongy(),oastillero,oastillero.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(oastillero);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 2

            case 3:
                if(mapa.disponible(x,y,Hangar.getLongx(),Hangar.getLongy())){
                    Hangar ohangar=new Hangar();
                    mapa.ubicarConstruccion(x,y,Hangar.getLongx(),Hangar.getLongy(),ohangar,ohangar.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ohangar);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 3

        }//FIN SWITCH
    }

    public void contruirIndustria(int indclase,int x, int y){
        switch(indclase){
            case 1:
                if(mapa.disponible(x,y,PozoPetrolero.getLongx(),PozoPetrolero.getLongy())){
                    PozoPetrolero opozo=new PozoPetrolero();
                    mapa.ubicarConstruccion(x,y,PozoPetrolero.getLongx(),PozoPetrolero.getLongy(),opozo,opozo.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(opozo);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 1

            case 2:
                if(mapa.disponible(x,y,Granja.getLongx(),Granja.getLongy())) {
                    Granja ogranja=new Granja();
                    mapa.ubicarConstruccion(x,y,Granja.getLongx(),Granja.getLongy(),ogranja, ogranja.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ogranja);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 2

            case 3:
                if(mapa.disponible(x,y,MinaDeMinerales.getLongx(),MinaDeMinerales.getLongy())){
                    MinaDeMinerales omina=new MinaDeMinerales();
                    mapa.ubicarConstruccion(x,y,MinaDeMinerales.getLongx(),MinaDeMinerales.getLongy(),omina,omina.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(omina);
                }
                else System.out.println("No se puede construir el espacio esta ocupado");
                break; //break caso 3

            case 4:
                if(mapa.disponible(x,y,Aserradero.getLongx(),Aserradero.getLongy())){
                    Aserradero oaserra=new Aserradero();
                    mapa.ubicarConstruccion(x,y,Aserradero.getLongx(),Aserradero.getLongy(),oaserra,oaserra.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(oaserra);
                }
                else System.out.println("No se puede construir el espacio esta ocupado");
                break;// Break caso 4

        } //FIN SWITCH
    }

    public void contruirVivienda(int indclase,int x, int y){
        switch(indclase){
            case 1: //cabanha
                if(mapa.disponible(x,y,Vivienda.getLongxK(),Vivienda.getLongyK())){
                    Vivienda ovivienda=new Vivienda(1,'K');
                    mapa.ubicarConstruccion(x,y,Vivienda.getLongxK(),Vivienda.getLongyK(),ovivienda,ovivienda.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ovivienda);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 1

            case 2: //casa
                if(mapa.disponible(x,y,Vivienda.getLongxT(), Vivienda.getLongyT())) {
                    Vivienda ovivienda=new Vivienda(2,'T');
                    mapa.ubicarConstruccion(x,y,Vivienda.getLongxT(),Vivienda.getLongyT(),ovivienda,ovivienda.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ovivienda);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 2

            case 3: //bongalow
                if(mapa.disponible(x,y,Vivienda.getLongxB(),Vivienda.getLongyB())){
                    Vivienda ovivienda=new Vivienda(3,'B');
                    mapa.ubicarConstruccion(x,y,Vivienda.getLongxB(),Vivienda.getLongyB(),ovivienda,ovivienda.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ovivienda);
                }
                else System.out.println("No se puede construir el espacio esta ocupado");
                break; //break caso 3

            case 4: //palafito
                if(mapa.disponible(x,y,Vivienda.getLongxF(),Vivienda.getLongyF())){
                    Vivienda ovivienda=new Vivienda(4,'F');
                    mapa.ubicarConstruccion(x,y,Vivienda.getLongxF(),Vivienda.getLongyF(),ovivienda,ovivienda.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ovivienda);
                }
                else System.out.println("No se puede construir el espacio esta ocupado");
                break; //break caso 4

        } //Fin switch
    }
    public void contruirGobierno(int indclase,int x, int y){
        switch(indclase){
            case 1: //PARLAMENTO
                if(mapa.disponible(x,y,Gobierno.getLongxP(),Gobierno.getLongyP())){
                    Gobierno ogobierno=new Gobierno(1,'P');
                    mapa.ubicarConstruccion(x,y,Gobierno.getLongxP(),Gobierno.getLongyP(),ogobierno,ogobierno.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ogobierno);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 1

            case 2://MANSION
                if(mapa.disponible(x,y,Gobierno.getLongxM(), Gobierno.getLongyM())) {
                    Gobierno ogobierno=new Gobierno(2,'M');
                    mapa.ubicarConstruccion(x,y,Gobierno.getLongxM(), Gobierno.getLongyM(),ogobierno,ogobierno.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ogobierno);
                }
                else System.out.println("No se puede construir el spacio esta ocupado ");
                break; //break caso 2

            case 3://PALACIO
                if(mapa.disponible(x,y,Gobierno.getLongxJ(),Gobierno.getLongyJ())){
                    Gobierno ogobierno=new Gobierno(3,'J');
                    mapa.ubicarConstruccion(x,y,Gobierno.getLongxJ(),Gobierno.getLongyJ(),ogobierno,ogobierno.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ogobierno);
                }
                else System.out.println("No se puede construir el espacio esta ocupado");
                break; //break caso 3

            case 4://SIN
                if(mapa.disponible(x,y,Gobierno.getLongxS(),Gobierno.getLongyS())){
                    Gobierno ogobierno=new Gobierno(4,'S');
                    mapa.ubicarConstruccion(x,y,Gobierno.getLongxS(),Gobierno.getLongyS(),ogobierno,ogobierno.getSimbolo());
                    posicion.add(new coordenadas(x,y));
                    construcciones.add(ogobierno);
                }
                else System.out.println("No se puede construir el espacio esta ocupado");
                break; //break caso 4

        } //FIN SWITCH
    }

} //FIN CLASE JUEGO